[AWS AppConfig] AppConfig の機能フラグで設定した値に基づいて CDK を deploy してみました
1 はじめに
CX 事業本部のデリバリー部の平内(SIN)です。
AWS AppConfig(以下、AppConfig)を利用すると、「機能の切り替え」などのタスクを安全に効率的に行うことができます。
AWS AppConfig とは?
AWS CDK は、TypeScript などの言語で作成されているため、AWS SDK を使用して AppConfig から動的にパラメータを取得し、それに基づいてスタックを構築することも可能になります。
なお、CDK で AWS SDK によるリソースアクセスをした場合、「コード(及び、パラメータ)等の動的な変更」という位置付けになるため、カスタムリソースを使用した、Create/Update/Delete の各ステージへの完全な対応ができない場合もあることに注意が必要です。
今回は、上記の制約を踏まえた上で、AppConfig で設定したパラメータに基づいて、CDK を deploy してみました。
2 AppConfig の設定
最初に、参照する AppConfig を設定です。
アプリケーションとして MyProject 、機能フラグとして cdkParamsを作成しました。
設定した内容は、以下のようになっています。
- key1:value1
- key2:value2
- key3:value3
環境 prodでデプロイしました。
3 CDK
AWS リソースへのアクセスは、AWS SDK で記述できますが、これには、非同期(async/await)が必須になります。
コンストラクタでは、非同期の処理が書けないので、CDK のコンストラクタを生成する前に、前処理としてリソースにアクセスしたコードが、以下の通りです。
スタックを生成する前に、AppConfig から設定値を読み込んで、スタックのパラメータに渡しています。
bin/my-project.ts
#!/usr/bin/env node import "source-map-support/register"; import * as cdk from "aws-cdk-lib"; import { MyProjectStack } from "../lib/my-project-stack"; import { GetLatestConfigurationCommand, StartConfigurationSessionCommand, AppConfigDataClient, } from "@aws-sdk/client-appconfigdata"; preProcessor(); async function preProcessor() { const client = new AppConfigDataClient({}); const input = { ApplicationIdentifier: "MyProject", EnvironmentIdentifier: "prod", ConfigurationProfileIdentifier: "cdkParams", }; const startConfigurationSessionCommand = new StartConfigurationSessionCommand( input ); const session = await client.send(startConfigurationSessionCommand); const getLatestConfigCommand = new GetLatestConfigurationCommand({ ConfigurationToken: session.InitialConfigurationToken, }); const response = await client.send(getLatestConfigCommand); const appConfigText = new TextDecoder().decode(response.Configuration); const appConfg = JSON.parse(appConfigText); const app = new cdk.App(); new MyProjectStack(app, "MyProjectStack", appConfg.params); }
スタックのコードでは、単順にパラメータで受け取った値を、出力しただけです。 本来は、このパラメータの値に基づいて、各種のリソースを構築することになると思います。
lib/my-project-stack.ts
import * as cdk from "aws-cdk-lib"; import { Construct } from "constructs"; export class MyProjectStack extends cdk.Stack { constructor(scope: Construct, id: string, props?: cdk.StackProps) { super(scope, id, props); new cdk.CfnOutput(this, "Output", { value: JSON.stringify(props), }); } }
4 動作確認
(1) deploy
CDK を deploy した時の状況です。Output で AppConfig の設定内容を確認することができます。
% cdk deploy ・・・略・・・ ✅ MyProjectStack ✨ Deployment time: 13.33s Outputs: MyProjectStack.Output = {"enabled":true,"key1":"value1","key2":"value2","key3":"value3"} Stack ARN: arn:aws:cloudformation:ap-northeast-1:439028474478:stack/MyProjectStack/11393930-a8a0-11ed-a0b2-0a10070d8239 ✨ Total time: 18.62s
(2) パラメータ変更
設定値を変更して AppConfig をデプロイします。
- key1:value100
- key2:value200
- key3:value300
CDK を再度 deploy すると、Output が変化していることを確認できます。
% cdk deploy ・・・略・・・ ✅ MyProjectStack ✨ Deployment time: 13.2s Outputs: MyProjectStack.Output = {"enabled":true,"key1":"value100","key2":"value200","key3":"value300"} Stack ARN: arn:aws:cloudformation:ap-northeast-1:439028474478:stack/MyProjectStack/11393930-a8a0-11ed-a0b2-0a10070d8239 ✨ Total time: 19.05s
5 最後に
今回は、AppConfig で設定したパラメータに基づいて、CDK を deploy してみました。
AppConfig は、正規表現で制約することで、比較的に安全に設定値変更を公開することが可能です。この辺の利点を CDK と組み合わせることで、少し、デプロイ方法のバリエーションも増えるのでは?と感じています。
なお、繰り返しで恐縮ですが、利用に際しては、CDK の動的変更による副作用への充分な配慮が必要なことを、念の為、付け加えさせてください。
6 参考にさせて頂いたリンク
AWS AppConfig で設定プロファイルの比較が出来るようになりました
AWS AppConfig の機能フラグがパブリックプレビューになっていたので使ってみた
【AWS AppConfig】機能フラグを作成して環境にデプロイするまでの流れを AWS CLI でやってみた
[AWS CDK] AWS Lambda-backed カスタムリソースは、もう必要ない!(場合もある)